package com.nwpu.main;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;

/**
 * RMIClient
 *
 * @author 龙虹宇
 * @version 1.0
 * @date 2023/11/1
 */
public class RMIClient {
    // 默认 RMIRegistry 端口
    private static int PORT = 1099;
    // 默认IP
    private static String IP = "127.0.0.1";
    // rmi注册表
    private static Registry registry;
    // 远程方法类
    private static IMethodSet methodSet;
    // 指令前缀：java [clientname] [servername] [portnumber]
    private static String insPrefix;
    // 指令前缀合法标志
    private static boolean flag = false;
    // Scanner
    private static final Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        while (true) {
            try {
                // 存储输入的指令
                String inputLine;
                System.out.println("请输入指令：");
                // 指令前缀是否为空
                if (insPrefix == null) {
                    // 判断指令前缀是否合法
                    inputLine = sc.nextLine();
                    flag = processInputLine(inputLine);
                } else {
                    // 指令前缀不为空且合法
                    System.out.print(insPrefix);
                    inputLine = sc.nextLine();
                    inputLine = insPrefix + inputLine;
                }
                // 指令前缀合法
                if (flag) {
                    // 远程方法调用
                    String returnStr = methodSet.processInstruction(inputLine);
                    if ("quit".equals(returnStr)) {
                        System.out.println("info：退出成功");
                        System.exit(0);
                    }
                    System.out.println(returnStr);
                } else {
                    // 跳转至catch
                    throw new Exception("指令错误");
                }
                // 第一次执行到这里，说明指令前缀输入无误
                // 直接存储在insPrefix中
                if (insPrefix == null) {
                    int end = inputLine.indexOf(inputLine.split(" ")[4]);
                    insPrefix = inputLine.substring(0, end);
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("error：您输入的指令有误，请重新输入：");
            }
        }
    }

    /**
     * 判断指令前缀是否合法
     *
     * @param inputLine
     * @return 合法：true  不合法：false
     * @throws Exception
     */
    private static boolean processInputLine(String inputLine) throws Exception{
        String[] strings = inputLine.split(" ");
        // 判断第一项是否为java
        if (!"java".equals(strings[0])) return false;
        // 判断前5项是否有缺失
        if (strings[4] == null) return false;

        IP = strings[2];
        PORT = Integer.parseInt(strings[3]);

        // 获取RMIRegistry
        registry = LocateRegistry.getRegistry(IP, PORT);
        // 判断IP和PORT合法性
        if (registry.list().length == 0) return false;
        // 检索方法类
        methodSet = (IMethodSet) registry.lookup("methodSet");

        return true;
    }
}
